home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / libs / anivga12 / unlib.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1993-07-11  |  5.9 KB  |  199 lines

  1. {$X+}
  2. PROGRAM Split_Sprite_LIB_Files;
  3. USES DOS,Compression;
  4.  
  5. CONST {Fehlercodes des Animationspaketes: }
  6.       Err_None=0;
  7.       Err_NotEnoughMemory=1;
  8.       Err_FileIO=2;
  9.       Err_NoSprite=4;
  10.       Err_DiskFull=7;
  11.  
  12. CONST dest:STRING[12]='UNLIB000.COD';
  13.  
  14. TYPE SpriteHeader= RECORD
  15.                     Zeiger_auf_Plane:Array[0..3] OF Word;
  16.                     Breite_in_4er_Gruppen:WORD;
  17.                     Hoehe_in_Zeilen:WORD;
  18.                     Translate:Array[1..4] OF Byte;
  19.                     SpriteLength:WORD;
  20.                     Dummy:Array[1..10] OF Word;
  21.                     Kennung:ARRAY[1..2] OF CHAR;
  22.                     Version:BYTE;
  23.                     Modus:BYTE;
  24.                     ZeigerL,ZeigerR,ZeigerO,ZeigerU:Word;
  25.                    END;
  26.  
  27. VAR Error : BYTE; {globale Fehlervariable}
  28.  
  29. FUNCTION GetErrorMessage:STRING;
  30. { in: Error = Nummer des aufgetretenen Fehlers}
  31. {out: den Fehler in Worten}
  32. BEGIN
  33.  CASE Error OF
  34.   Err_None:GetErrorMessage:='No Error';
  35.   Err_NotEnoughMemory:GetErrorMessage:='Not enough memory available on heap';
  36.   Err_FileIO:GetErrorMessage:='I/O-error with file';
  37.   Err_NoSprite:GetErrorMessage:='No (or corrupted) Sprite file';
  38.   Err_DiskFull:GetErrorMessage:='Fileerror: Disk full';
  39.  END;
  40. END;
  41.  
  42.  
  43. FUNCTION SplitSprites(Name:String):WORD;
  44. { in: Name   = Name des zu ladenden Sprite-Files (Typ: "*.COD" / "*.LIB" )}
  45. {     Number = Nummer, die das erste Sprite aus diesem File bekommen soll }
  46. {     dest   = Name, unter dem das erste Sprite abgelegt wird, i.d.R.     }
  47. {              "UNLIB000.COD"                                             }
  48. {out: Anzahl der aus dem File gelesenen Sprites (0 = Fehler trat auf)     }
  49. {     UNLIB000.COD, UNLIB001.COD,... = ausgelesene Sprites                }
  50. {rem: Die Routine erkennt automatisch, ob es sich bei dem File um ein ein-}
  51. {     zelnes Sprite oder eine ganze Spritebibliothek handelt und laedt    }
  52. {     alle Spritedaten auf den Heap, und zwar derart, dass die Adresse    }
  53. {     immer auf eine Segmentgrenze fällt. Diese Anfangsadressen werden    }
  54. {     dann in der Tabelle SPRITEAD[Number] abgelegt; sind mehrere Sprites }
  55. {     in der Datei so werden sie mit fortlaufender Nummer eingetragen,    }
  56. {     also Number+i }
  57.  
  58.    FUNCTION Update(VAR ch:CHAR):BOOLEAN;
  59.    { in: ch = Ziffer als Zeichen   : '0'..'9'}
  60.    {out: ch = um 1 erhöhtes Zeichen: '1'..'0'}
  61.    {     TRUE/FALSE, falls Übertrag in nächsthöhere Stelle}
  62.    BEGIN
  63.     IF ch='9'
  64.      THEN ch:='0'
  65.      ELSE ch:=chr(succ(ord(ch)));
  66.     Update:=ch='0'
  67.    END;
  68.  
  69. LABEL quit_loop;
  70. TYPE SpriteBuffer=ARRAY[0..65534] OF BYTE;
  71. VAR Buffer: ^SpriteBuffer;
  72.     f:FileOfByte;
  73.     f2:File;
  74.     count,BytesWritten,Kopf:WORD;
  75.     Header:SpriteHeader;
  76. BEGIN
  77.  NEW(Buffer);
  78.  count:=0;  {Zahl der bisher eingelesenen Sprites}
  79.  Kopf:=SizeOf(SpriteHeader);
  80.  _assign(f,name);
  81.  {$I-} _reset(f); {$I+}
  82.  if (ioresult<>0) OR (CompressError<>CompressErr_NoError)
  83.   THEN BEGIN  {Datei existiert nicht oder nicht unter diesem Pfad}
  84.         Error:=Err_FileIO;
  85.         SplitSprites:=0; exit
  86.        END;
  87.  
  88.  WHILE NOT _physicalEOF(f) DO
  89.  BEGIN
  90.   WRITELN('...working on sprite '+dest);
  91.  
  92.   {Zunaechst den Spriteheader einlesen: }
  93.   {$I-}     {jetzt den Spriteheader vià BLOCKREAD auf den Heap laden}
  94.   _blockread(f,Header,Kopf);
  95.   {$I+}
  96.  
  97.   IF (ioresult<>0) OR (CompressError<>CompressErr_NoError)
  98.    THEN BEGIN
  99.          Error:=Err_FileIO;
  100.          goto quit_loop;
  101.         END;
  102.   IF (Header.Kennung[1]<>'K') or (Header.Kennung[2]<>'R')
  103.    THEN BEGIN
  104.          Error:=Err_NoSprite;
  105.          goto quit_loop;
  106.         END;
  107.   IF (Header.SpriteLength>MaxAvail+15)    {noch genug Platz da?}
  108.    THEN BEGIN
  109.          Error:=Err_NotEnoughMemory;
  110.          goto quit_loop;
  111.         END;
  112.  
  113.   MOVE(Header,Buffer^[0],Kopf);
  114.   {Jetzt eigentliche Spritedaten einlesen: }
  115.   {$I-}
  116.   _blockread(f,Buffer^[Kopf],Header.SpriteLength-Kopf);
  117.   {$I+}
  118.   IF (ioresult<>0) OR (CompressError<>CompressErr_NoError)
  119.    THEN BEGIN
  120.          Error:=Err_FileIO;
  121.          goto quit_loop
  122.         END;
  123.  
  124.   {$I-}     {jetzt das Sprite auf Disk schreiben}
  125.   assign(f2,dest);
  126.   Rewrite(f2,1);
  127.   {$I+}
  128.   IF (ioresult<>0)
  129.    THEN BEGIN
  130.          Error:=Err_FileIO;
  131.          goto quit_loop
  132.         END;
  133.   {$I-}
  134.   blockwrite(f2,Buffer^[0],Header.SpriteLength,BytesWritten);
  135.   {$I+}
  136.   IF Header.SpriteLength<>BytesWritten
  137.    THEN BEGIN
  138.          Error:=Err_DiskFull;
  139.          goto quit_loop
  140.         END;
  141.   IF (ioresult<>0)
  142.    THEN BEGIN
  143.          Error:=Err_FileIO;
  144.          goto quit_loop
  145.         END;
  146.   {$I-}
  147.   close(f2);
  148.   {$I+}
  149.   IF (ioresult<>0)
  150.    THEN BEGIN
  151.          Error:=Err_FileIO;
  152.          goto quit_loop
  153.         END;
  154.  
  155.   INC(count);
  156.   IF Update(dest[8])  {Filenamen für nächsten Aufruf generieren}
  157.    THEN IF Update(dest[7])
  158.          THEN Update(dest[6]);
  159.  
  160.   IF (NOT _physicalEOF(f))
  161.    THEN BEGIN
  162.          IF f.komprimiert AND (NOT _logicalEOF(f))
  163.       THEN BEGIN
  164.                 {nichts zu tun, da Library insgesamt komprimiert}
  165.                END
  166.           ELSE Resync(f); {am Ende einer logischen Datei}
  167.         END;
  168.  END;
  169.  
  170.  WRITELN('Done, extracted ',count,' sprites');
  171.  
  172. quit_loop: ;
  173.  _close(f);
  174.  SplitSprites:=count
  175. END;
  176.  
  177.  
  178. BEGIN
  179.  WRITELN;
  180.  WRITELN('UNLIB V1.1  -- Splits a spritelibrary into its *.COD-files');
  181.  WRITELN(' by Kai Rohrbacher, 1991');
  182.  WRITELN;
  183.  IF ParamCount<>1
  184.   THEN BEGIN
  185.         WRITELN('*** Wrong parameters!');
  186.         WRITELN('Call UNLIB with the name of your spritelibrary to split, e.g.:');
  187.         WRITELN;
  188.         WRITELN('  UNLIB c:\sprites\my_files.LIB');
  189.         WRITELN;
  190.         WRITELN('UNLIB will create the *.COD-files in the current directory,');
  191.         WRITELN('starting with the name '+dest+' and using increasing numbers.');
  192.         Halt(1);
  193.        END;
  194.  Error:=Err_None;
  195.  IF SplitSprites(ParamStr(1))=0
  196.   THEN BEGIN
  197.         WRITELN('*** Error: '+GetErrorMessage);
  198.        END;
  199. END.